<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="demo/js/ajax.js"></script>
</head>
<body>
    
</body>
<script>
    // 构造函数本身自带方法      (对比Array.isArray())
    // Promise.all()  
    // Promise.race()  

    // Promise.all()方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。
    // const p = Promise.all([p1, p2, p3]);
    // 上面代码中，Promise.all()方法接受一个数组作为参数，p1、p2、p3都是 Promise 实例,返回一个新的Promise 实例。

    //有时候，我们希望等到一组异步操作都结束了，不管每一个操作是成功还是失败，再进行下一步操作


    // 对比Promise.all()   Promise.allSettled()  
    // 共同点: 都返回一个新的Promise实例

    // 不同点:
    // Promise.all([p1,p2,p3])  => p   新的实例依赖于 p1,p2,p3 => 全都成功(新的实例p会变成已成功 => 返回结果集合)   只要有一个变为已失败 => (新的实例p也会变为已失败)
    // Promise.allSettled([p1,p2,p3])  => p   不管 p1,p2,p3 每一个操作是成功还是失败， =>  都会返回成功状态的Promise实例(新的实例p)  => 返回一个结果的集合   
    //   [{ status: "fulfilled", value: xxx },{ status: "rejected", reason: xxx }]

    function isExistUser(params = {}){
        var p  = new Promise(function(resolve, reject){
            $.ajax({
                type: "get",
                url: "demo/php/isExistUser.php",
                data: {
                    ...params,
                },
                dataType: "json",
                success: function(result){
                    var { status, msg } = result;
                    if(status){
                        resolve(msg);
                    }else{
                        reject(msg);
                    }
                },
                error:function(err){
                    reject(err);
                }
            })
        })
    }

    console.time("aa");
    var p1 = isExistUser({user:"a123123"});
    var p2 = isExistUser({user:"b123123"});
    var p3 = isExistUser({user:"c123123"});
    var p4 = isExistUser({user:"d123123"});

    Promise.allSettled([p1,p2,p3,p4]).then(list => {
        console.log(list);
    }).catch(err => {
        console.log(err);
    })

    // 模拟封装
    /*  Promise.myAllSettled = function (list) {
         return new Promise(function (resolve, reject) {
             var arr = [];
             for (let i = 0; i < list.length; i++) {
                 var p = list[i];// 每一个Promise实例
 
                 // 提前规定好每一个实例 成功和失败时执行的内容  => 请求有结果之后会执行
                 p.then(txt => {  //等待异步操作有结果之后 对应下标放到数组中
                     // arr[i] = txt;
                     var obj = { status: "fulfilled", value: txt };
                     arr[i] = obj;
                     console.timeLog("aa");
                     if (arr.length === list.length) { // 三个请求全都成功 => arr(异步)
                         resolve(arr);
                     }
                 }).catch(err => {
                     // console.log(err);
                     // arr[i] = err;
                     var obj = { status: "rejected", reason: err };
                     arr[i] = obj;
                     if (arr.length === list.length) { // 三个请求全都成功 => arr(异步)
                         resolve(arr);
                     }
                 })
             }
         })
     }
 
     Promise.myAllSettled([p1, p2, p3, p4]).then(list => {
         console.log(list);
     }).catch(err => {
         console.log(err);
     }) */
</script>
</html>